package com.company.config;

import com.company.dao.BookDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/*
    自动装配
      Spring利用依赖注入（DI）完成对容器中的各个组件的依赖关系
      1 @Autowired 自动驻入
           1 默认优先按照类型去容器中找对应的组件
           2 如果找到多个相同类型的组件，再将属性名作为组件id去容器查找
             BookService{
                @AutoWired
                BookDao bookdao
           }
           3 @Qualifier("bookDao") 明确指定要装配的组件id
           4 自动装配一定要把属性赋值好
           5 @Primary 让spring自行自动装配时候，默认首选的bean
      3 @Autowired 构造器，参数，方法，属性都是从容器中获取参数组件的值
           1 标注在方法上  @Bean+方法参数，参数从容器获取，默认不写@Autowried
           2 标准在构造器位置，如果组件只有一个有参构造器，这个有参构造器@Autowried可以省略
           3 放在参数位置

      4 自定义组件想要实现Spring容器底层一些组件，（ApplicationContext，BeanFactory，XXX）；
           自定义组件实现xxxAware；在创建对象的时候会调用接口规定的方法注入相关组件 参照Aware接口\
           把Spring底层的一些组件注入到自定义的Bean中
           xxxAware，功能使用xxxProcessor
               ApplicationContextAware ---》 ApplicationContextAwareProcessor
 */
@Configuration
@ComponentScan({"com.company"})
public class MainConfigOfAutowired {

    @Bean("bookDao2")
    public BookDao bookDao() {
        BookDao bookDao = new BookDao();
        bookDao.setLabel(2);
        return bookDao;
    }

}
